谈谈Windows中的错误处理机制
windows除了使用返回值标识函数执行情况,还引入了错误代码机制。返回值指示函数是否发生了错误,而要想知道究竟发生了什么错误,就得使用错误代码。
windows将错误代码存储于独立于线程的,线程局部存储区中,也就是说这个区域时每个线程独有的其他线程无法更改,它存储着一些线程独有的东西。
在函数执行后,可通过
GetLastError()
函数来获得错误代码,并且这个代码永远反应的是上一个函数的执行情况,也就是说它的值是由上一个函数设置的,那么当调用一个函数后没有调用GetLastError()
就调用其他函数,此时GetLastError()
返回的就是第二个函数的执行情况。1DWORD GetLastError();GetLastError()
返回的是一个DWORD类型的数,我们无法直接从返回值得知具体的错误是什么,VS中给我们地提供了一个小工具可以将错误代码转换为相应的文本描述。在VS中你可以这样操作:工具-错误查找,只要输入相应的DWORD类型数就可以得到具体的错误信息。另外,windows提供了函数
FormatMessage()
可以将传入的错误代码转换为对应的字符串的首地址。调用
GetLastError()
返回的是windows定义的错误代码,我们还可以将这种机制用于我们自己的函数中,比如现在写了一个函数,返回false表示调用失败,那么此时你还可以使用错误代码来提供更多的信息,通过使用SetLastError()
可以设置我们想设置的值,它将线程局部存储区的错误代码设置为我们传递的值,此后调用GetLastError()
返回的就是我们刚刚设置的值。Windows.h中定义了256个错误代码用于标识256中错误情况,我们在使用
SetLastError()
时 ,可以传入windows定义过得大部分错误代码,如果所有这些均不能满足,你可以传入大于255的数作为错误代码。调试程序时,可以在watch窗口中输入$err,hr,它会在value一列显示当前线程的上一个错误代码和该值对应的 文本描述。
本文参考ithzhang的博客,想知道更多的可以去阅读他的博客:ithzhang的博客